package com.augurit.common.dao;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.augurit.common.base.dao.BaseDao;
import com.augurit.common.entity.AcRoleFunc;
import com.augurit.common.system.convert.AcRoleConverter;
import com.augurit.common.system.web.org.form.AcRoleFuncForm;
import com.augurit.common.util.lang.CollectionUtils;

/**
 * 角色功能关联DAO类
 */
@Repository
public class AcRoleFuncDao extends BaseDao<AcRoleFunc, Long> {

	/**
	 * 保存角色功能关联Form对象
	 * @param form 角色功能关联Form对象
	 */
	public void save(AcRoleFuncForm form){
		
		if(form != null){
			AcRoleFunc entity = null;
			
			//准备VO对象
			if(form != null && form.getRfId() != null){
				entity = this.get(form.getRfId());
			}else{
				entity = new AcRoleFunc();
			}
			
			//属性值转换
			AcRoleConverter.convertToEntity(form, entity);
			
			//保存
			super.save(entity);
			
			//回填ID属性值
			form.setRfId(entity.getRfId());
		}
	}
	
	/**
	 * 根据功能ID找出主键ID集合
	 * @param funcId 功能ID
	 * @return
	 */
    public List<Long> getIdsByFuncId(Long funcId){
    	if(funcId != null)
	    	return partSelectByFuncId(funcId, "rfId");
    	else
    		return null;
    }
    
	/**
	 * 根据功能ID找出对象列表
	 * @param funcId 功能ID
	 * @return
	 */
    public List<AcRoleFunc> getByFuncId(Long funcId){
    	if(funcId != null)
	    	return partSelectByFuncId(funcId, null);
    	else
    		return null;
    }
    
    /**
     * 根据功能id获取角色id集合
     * @param funcId 功能id
     * @return 角色id集合
     */
    public Long[] getRoleIdsByFuncId(Long funcId){
    	if( funcId != null){
    		List<Long> list = partSelectByFuncId(funcId,"roleId");
    		return CollectionUtils.toLongArray(list);
    	}
    	else
    		return null;
    }
    
    /**
     * 根据角色id找出具有此角色的功能
     * @param roleId
     * @return
     */
    public List<Long> getFuncIdsByRoleId(Long roleId){
    	if(roleId != null){
    		List<Long> list = partSelectByRoleId(roleId, "funcId");
    		return partSelectByRoleId(roleId, "funcId");
    	}
    	else
    		return null;
    }

    /**
     * 返回要查询的结果
     * @param funcId
     * @param entityProperty
     * @return
     */
    private List partSelectByRoleId(Long roleId, String entityProperty){
    	String hql = "select " 
					+ (entityProperty != null && entityProperty.trim().length() > 0 ? "ps." + entityProperty : "ps") 
					+ " from AcRoleFunc ps where ps.roleId = ?";
    	List values = new ArrayList();
    	values.add(roleId);
    	return this.find(hql, values);
    }
    
    /**
     * 返回要查询的结果
     * @param funcId
     * @param entityProperty
     * @return
     */
    private List partSelectByFuncId(Long funcId, String entityProperty){
		String hql = "select " 
						+ (entityProperty != null && entityProperty.trim().length() > 0 ? "ps." + entityProperty : "ps") 
						+ " from AcRoleFunc ps where ps.funcId = ?";
		List values = new ArrayList();
		values.add(funcId);
		
		return this.find(hql,values);
	}
    
	/**
	 * 向AC_ROLE_FUNC关联表中添加一条记录
	 * @param roleId：角色id
	 * @param funcId:功能id
	 * @param moduleId:模块id
	 * @param appId:应用id
	 */
	public void addAcRoleFunc(Long roleId, Long funcId, Long moduleId, Long appId){
		if(roleId != null && funcId != null && moduleId != null && appId != null){
			List<AcRoleFunc> list = this.getByRoleIdAndFuncId(roleId, funcId);
			//当该角色没有拥有这项功能时
			if(list == null || list.size() <= 0){
				AcRoleFuncForm form = new AcRoleFuncForm();
				form.setRoleId(roleId);
				form.setFuncId(funcId);
				form.setModuleId(moduleId);
				form.setAppId(appId);
				this.save(form);
			}
			
		}
	}
    
    /**
	 * 删除关联功能ID的对象列表
	 * @param funcId 功能ID
	 * @return
	 */
    public void deleteByFuncId(Long funcId){
    	List<AcRoleFunc> list = getByFuncId(funcId);
    	if(list != null && list.size() > 0)
    		this.delete(list);
    }
    
    /**
     * 删除指定角色关联的功能
     * @param roleId 角色id
     */
    public void deleteByRoleId(Long roleId){
    	if(roleId == null)
    		return;
    	
    	List<AcRoleFunc> entities = this.findBy("roleId", roleId);
    	if(entities != null && entities.size() > 0){
			this.delete(entities);
		}
    }
    
    /**
     * 根据roleId和(funcId,moduleId,appId)中一个属性查找对应的记录列表
     * @param roleId 角色id
     * @param propertyId funcId或moduleId或appId
     * @param entityProperty "funcId"或"moduleId"或"appId"
     * @return 实体列表
     */
    private List<AcRoleFunc> getByRoleIdAndOneProperty(Long roleId,Long propertyId,String entityProperty){
    	if(roleId != null && propertyId != null 
    			&& entityProperty != null && entityProperty.trim().length() > 0){
    		String hql = "select ps from AcRoleFunc ps where ps.roleId=? " 
    			         + "and ps." + entityProperty + "=?" ;
    		List values = new ArrayList();
    		values.add(roleId);
    		values.add(propertyId);
    		
    		return this.find(hql, values);
    	}
    	return null;
    }
    
    /**
     * 根据roleId和(funcId,moduleId,appId)中一个属性查找对应的记录的id列表
     * @param roleId 角色id
     * @param propertyId funcId或moduleId或appId
     * @param entityProperty "funcId"或"moduleId"或"appId"
     * @return 实体列表
     */
    private List<Long> getRfIdsByRoleIdAndOneProperty(Long roleId,Long propertyId,String entityProperty){
    	if(roleId != null && propertyId != null 
    			&& entityProperty != null && entityProperty.trim().length() > 0){
    		String hql = "select ps.rfId from AcRoleFunc ps where ps.roleId=? " 
    			         + "and ps." + entityProperty + "=?" ;
    		List values = new ArrayList();
    		values.add(roleId);
    		values.add(propertyId);
    		
    		return this.find(hql, values);
    	}
    	return null;
    }
  
    /**
     * 根据roleId和funcId找出相应的记录列表
     * @param roleId 角色id
     * @param funcId 功能id
     * @return
     */
    public List<AcRoleFunc> getByRoleIdAndFuncId(Long roleId,Long funcId){
    	if(roleId != null && funcId != null){
        	return this.getByRoleIdAndOneProperty(roleId,funcId,"funcId");
    	}
    	return null;
    }
    
    /**
     * 根据roleId和funcId找出相应的记录主键id列表
     * @param roleId 角色id
     * @param funcId 功能id
     * @return
     */
    public List<Long> getRfIdsByRoleIdAndFuncId(Long roleId,Long funcId){
    	if(roleId != null && funcId != null){
        	return this.getRfIdsByRoleIdAndOneProperty(roleId,funcId,"funcId");
    	}
    	return null;
    }
    
    /**
     * 根据roleId和moduleId找出相应的记录
     * @param roleId 角色id
     * @param moduleId 模块id
     * @return
     */
    public List<AcRoleFunc> getByRoleIdAndModuleId(Long roleId,Long moduleId){
    	if(roleId != null && moduleId != null){
    		return this.getByRoleIdAndOneProperty(roleId, moduleId, "moudleId");
    	}
    	return null;
    }
    
    /**
     * 根据roleId和moduleId找出相应的记录主键id列表
     * @param roleId 角色id
     * @param moduleId 模块id
     * @return
     */
    public List<Long> getRfIdsByRoleIdAndModuleId(Long roleId,Long moduleId){
    	if(roleId != null && moduleId != null){
    		return this.getRfIdsByRoleIdAndOneProperty(roleId, moduleId, "moduleId");
    	}
    	return null;
    }
    
    /**
     * 根据roleId和appId找出相应的记录
     * @param roleId 角色id
     * @param appId 应用id
     * @return
     */
    public List<AcRoleFunc> getByRoleIdAndAppId(Long roleId,Long appId){
    	if(roleId != null && appId != null){
    		return this.getByRoleIdAndOneProperty(roleId, appId, "appId");
    	}
    	return null;
    }
    
    /**
     * 根据roleId和appId找出相应的记录主键id列表
     * @param roleId 角色id
     * @param appId 应用id
     * @return
     */
    public List<Long> getRfIdsByRoleIdAndAppId(Long roleId,Long appId){
    	if(roleId != null && appId != null){
    		return this.getRfIdsByRoleIdAndOneProperty(roleId, appId, "appId");
    	}
    	return null;
    }
}
